package main

import (
	"log"
	"net"
	"net/http"
	"net/rpc"
	"studyGolangDemo01/rpc/server/server_func"
)

// net/rpc 提供的RPC 框架，要想把一个对象注册为 RPC 服务，可以让客户端远程访问，那么该对象（类型）的方法必须满足如下条件：
// 		1、方法的类型是可导出的（公开的）；
// 		2、方法本身也是可导出的；
// 		3、方法必须有 2 个参数，并且参数类型是可导出或者内建的；
// 		4、方法必须返回一个 error 类型。
// 总结就是：
// func (t *T) MethodName(argType T1, replyType *T2) error
// 此处 T1、T2都是可以被 encoding/gob 序列化的。
// 		1、第一个参数 argType 是调用者（客户端）提供的；
// 		2、第二个参数 replyType是返回给调用者结果，必须是指针类型。

func main() {
	// 通过 RegisterName 函数注册了一个服务对象，该函数有两个参数：
	// 		1、服务名称，客户端调用时所使用（MathService）
	// 		2、服务对象，也就是 MathService 这个结构体
	rpc.RegisterName("MathService", new(server_func.MathService))

	rpc.HandleHTTP() // 新增的，为了将tcp调用修改为http调用
	// 通过 net.Listen 函数建立一个 TCP 链接，在 8088 端口进行监听
	l, err := net.Listen("tcp", ":8088")
	if err != nil {
		log.Fatal("listen error", err)
	}

	// 最后通过 rpc.Accept 函数在该 TCP 链接上提供 MathService 这个 RPC 服务。如此，客户端便可看到 MathService 这个服务以及它的 Add 方法了。
	// rpc.Accept(l)
	http.Serve(l, nil) // 将tcp调用修改为http调用
}
